#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__author__ = "wqk151"
__name__="client"
__date__="2016/8/14 0014"
__time__="14:56"
"""
import threading
import redishelper
import redis
import pickle
import time
from plugins import plugin_api
host_ip = '192.168.1.1' # 客户端地址，存在hosts文件的group中。
class MonitorClient(object):
    def __init__(self,server,port):
        self.server = server
        self.port = port
        self.configs = {}   # 获取配置信息
        self.redis = redishelper.RedisHelper()

    def format_msg(self,key,value): # 将序列化定义为一个方法。
        msg = {key:value}
        return pickle.dumps(msg)
    def get_configs(self): # 获取配置文件
        config = self.redis.get('HostConfig::%s' % host_ip) # 获取配置信息
        if config:
            self.configs=pickle.loads(config)   #pickle不能空值，dump可以空值。
            return True
    def handle(self):   # 处理监控间隔多线程。间隔期间线程不必要一直存在而浪费资源，可以由主线程来维护一个间隔时间表，定时来启动线程，运行完成后销毁线程。
        if self.get_configs():
            print '--going to monitor--',self.configs
            while True:
                for service_name,val in self.configs['services-hehe'].items():  # 将字典的键值转换成列表分别赋值给service_name 和val。
                    interval,plugin_name,last_check_time = val  # val是一个列表，将列表的元素分别赋值。
                    if time.time() - last_check_time >= interval:
                        t = threading.Thread(target=self.task,args=[service_name,plugin_name])
                        t.start()
                        self.configs['services-hehe'][service_name][2] = time.time() # update last check time
                    else:
                        next_run_time = interval - (time.time() - last_check_time)
                        print '\033[32;1m%s\033[0m will be run in next \033[32;1m%s\033[0m seconds' %(service_name,next_run_time)
                time.sleep(1)
        else:
            print 'error --could not find any configurations for this host--'
    def task(self,service_name,plugin_name):
        print '--going to run service:',service_name,plugin_name
        func = getattr(plugin_api,plugin_name)  # 反射方法调用插件,根据传入的plugin_name，调用相应的方法
        result = func() # 插件执行返回的结果。
        #self.redis.public(pickle.dumps(result)) # 发布到redis，给服务端接收
        msg = self.format_msg('report_services_data',
                                 {'ip':host_ip,
                                  'service_name':service_name,
                                  'data':result
                                  }
                              ) # 整合消息
        self.redis.public(msg)  # 想整合后的消息存入redis，提交给server端。
    def run(self): # 调用handle方法
        self.handle()

if __name__ == '__main__':
    cli = MonitorClient('192.168.4.129P','6379')
    cli.run()
